home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
QRZ! Ham Radio 6
/
QRZ Ham Radio Callsign Database - Volume 6.iso
/
mac
/
files
/
amiga
/
csrc720j.lzh
/
prtlog.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-10
|
15KB
|
640 lines
/*
* PRTLOG.C - 10/11/87 - Print a log file. For C BBS V3.5
*/
#include <stdio.h>
#ifdef MCH_AMIGA
/* Modifications for the AMIGA version V6.71b
The program has a correction to make the system uptime more realistic.
I have also added code to do a little bit more 'accounting' of each
user. A third output page has been added which, for each user who logs
in and for each bbs that does a reverse forward, contains the total
connect time and number of connects, Total number of read and send
commands and the total number of forwards (which is also reported on
the previous page.
This program still does not do accounting for multi-port systems
because although it reports which port a user is on when they log in,
the disconnect command does not report which port is logging out. This
makes it difficult to be sure who is actually logged out.
*/
#include <string.h>
#include <stdlib.h>
long tdiff();
#endif
/* Cosmetic C definitions */
#define is ==
#define isnt !=
#define and &&
#define or ||
#define not !
#define true 1
#define false 0
#define match !strcmp
#define linelen 256
FILE *lfl;
int lall, isuser;
short first = false;
short wasq = true;
short aconnect = false;
long gate = 0;
long logd = 0;
long down = 0;
long avail = 0;
long online = 0;
long offline = 0;
long idle = 0;
long connected = 0;
long sysop = 0;
long fwdcon = 0;
long fwddis = 0;
int ngate = 0;
int nup = 0;
int ndown = 0;
int crash = 0;
int links = 0;
int nts = 0;
int scon = 0;
int ucon = 0;
int lines = 0;
static char line[linelen];
#ifdef MCH_AMIGA
static char sysop_call[6];
static char conx_call[9];
short sysop_log = 0;
#endif
char *fst, *lp, typ, fn, sfn;
struct t
{
char year[2];
char month[2];
char day[2];
char time[4];
} con, dis, cur, fir, gat, las, sfwd;
int nmsg;
int cbin[31][24];
int fbin[31][24];
typedef struct FWD_S
{
char call[9];
int count;
#ifdef MCH_AMIGA
long connect;
short conx_count;
short reads;
short sends;
#endif
struct FWD_S *next;
} FWD;
FWD *fwdhd = NULL;
FWD *fp;
#ifdef MCH_AMIGA
FWD *fp_file;
FWD *fp_conx;
#endif
#define softeof '\032'
main(argc, argv)
int argc;
char *argv[];
{
register char ch, *cp;
int i, j, t, done, infile, nfwd;
int firstent = true;
if (*argv[1] is '-')
{
infile = 2; lall = true;
}
else
{
infile = 1; lall = false;
}
if ((lfl = fopen(argv[infile], "r")) is NULL)
{ printf("File not found.\n"); exit(0); }
for (i = 0; i < 31; i++) for (j = 0; j < 24; j++)
{ cbin[i][j] = 0; fbin[i][j] = 0; }
while (fgets(line, linelen, lfl) isnt NULL)
{
lp = line;
typ = *lp++;
cur.year[0] = *lp++; cur.year[1] = *lp++;
cur.month[0] = *lp++; cur.month[1] = *lp++;
cur.day[0] = *lp++; cur.day[1] = *lp++;
for (cp = cur.time; cp < cur.time + 4;) *cp++ = *lp++;
fn = *lp++;
sfn = *lp++;
lp++;
for (cp = lp; *cp; cp++) if ((*cp is '\r') or (*cp is '\n')) *cp = '\0';
if (firstent)
{
con = cur; dis = cur; fir = cur; gat = cur; las = cur; sfwd = cur;
firstent = false;
}
if (lall)
{
if ((typ is 'C') and (fn isnt 'L')) printf("\n");
if (first and (typ is 'M') and (fn is 'F'))
{ first=false; printf("\n"); }
printf(" %2.2s/%2.2s/%2.2s %4.4s ",
cur.month,cur.day,cur.year,cur.time);
}
lines++;
switch(typ)
{
case 'C': doconn(); break;
case 'F': dofile(); break;
case 'G': dogate(); break;
case 'M': domsg(); break;
case 'X': doexit(); break;
default:
/* printf("Unknown log item type %c\n", typ); */
;
}
las = cur;
}
fclose(lfl);
if (lall) printf("\f");
#ifndef MCH_AMIGA
printf("\n Log for %6.6s ",call);
#else
printf("\n Log for %6.6s ",sysop_call);
#endif
printf("From %2.2s/%2.2s/%2.2s %4.4s ",
fir.month, fir.day, fir.year, fir.time);
printf(" To %2.2s/%2.2s/%2.2s %4.4s\n",
cur.month, cur.day, cur.year, cur.time);
printf(" Data from file %s\n",argv[infile]);
printf("\n Connects vs. Hour vs. Date\n\nDa");
ucon = prtbin(cbin);
avail = idle + connected;
online = avail + sysop;
logd = online + down + offline;
idle -= fwddis;
printf("\n%8d log items.\n", lines);
printf("%8ld minutes in log.\n", logd);
printf("%8ld minutes system down.\n", down);
printf("%8ld minutes system offline.\n", offline);
cp="minutes system online.";
printf("%8ld %-30s", online, cp);
printf(" (%5.1f%% of log time.)\n",100.*((float)online/(float)logd));
cp="minutes by sysop.";
printf("%8ld %-30s", sysop, cp);
printf(" (%5.1f%% of online time.)\n",100.*((float)sysop/(float)online));
cp="minutes forwarding.";
printf("%8ld %-30s", fwdcon + fwddis, cp);
printf(" (%5.1f%% of online time.)\n",100.*((float)(fwdcon + fwddis)/(float)online));
cp="minutes system available.";
printf("%8ld %-30s", avail, cp);
printf(" (%5.1f%% of online time.)\n",100.*((float)avail/(float)online));
cp="minutes by users.";
printf("%8ld %-30s", connected, cp);
printf(" (%5.1f%% of available time.)\n",100.*((float)connected/(float)avail));
cp="minutes system idle.";
printf("%8ld %-30s", idle, cp);
printf(" (%5.1f%% of available time.)\n",100.*((float)idle/(float)avail));
cp="minutes GateWay in use.";
printf("%8ld %-30s",gate,cp);
printf(" (%5.1f%% of available time.)\n",100.*((float)gate/(float)avail));
printf("\n%8d connects, %d were links.\n",ucon,links);
printf("%8d times used by sysop. GateWay used %d times.\n",
scon,ngate);
printf("\n%8d File uploads, %d File downloads.\n", nup, ndown);
printf("%8d probable system crashes.\n",crash);
printf("\f\n Forwards vs. Hour vs. Date\n\nDa");
nfwd=prtbin(fbin);
printf("\n%8d Messages entered.\n\n", nmsg);
printf("%8d NTS Messages (%5.1f%% of messages entered)\n\n",
nts, 100.*((float)nts/(float)nmsg));
printf("%8d Messages forwarded (%5.1f%% of messages entered)\n\n",
nfwd,100.*((float)nfwd/(float)nmsg));
for (fp = fwdhd; fp isnt NULL; fp = fp->next)
{
#ifdef MCH_AMIGA
if(fp->count) {
#endif
printf("%8d To %9.9s",fp->count,fp->call);
printf(" (%5.1f%% of messages forwarded.)\n",
100.*((float)fp->count/(float)nfwd));
#ifdef MCH_AMIGA
}
#endif
}
#ifdef MCH_AMIGA
printf("\f\n\n User Login Information \n\n");
printf(" Call <- Connected -> Reads Sends Fwds\n");
printf(" HHH:MM #### #### #### ####\n");
for(fp = fwdhd; fp isnt NULL; fp = fp->next) {
printf(" %9.9s ",fp->call);
printf(" %3d:%02d ",(short)(fp->connect/60),(short)(fp->connect%60));
printf(" %4d ",fp->conx_count);
printf(" %4d ",fp->reads);
printf(" %4d ",fp->sends);
printf(" %4d\n",fp->count);
}
printf("\n\n\n");
#endif
}
#ifdef MCH_AMIGA
FWD *getuser(call)
char *call;
{
register FWD *fp;
for(fp = fwdhd; fp isnt NULL; fp=fp->next) {
/* If this is the call then return. fp will be pointing to the
item
*/
if(!strncmp(fp->call, call, 9))return(fp);
}
fp = (FWD *)malloc(sizeof(FWD));
fp->next = fwdhd;
fwdhd = fp;
fp->count = 0;
fp->conx_count = 0;
fp->reads = 0;
fp->sends = 0;
fp->connect = 0L;
strncpy(fp->call, call, 9);
return(fp);
}
#endif
prtbin(b)
int b[31][24];
{
register int i, j, t, gt;
for (j = 0; j < 24; j++) printf("%3d",j); printf(" Totl\n");
for (i = 0; i < 31; i++)
{
t = 0;
printf("%2d",i+1);
for (j = 0; j < 24; j++)
{
if (b[i][j]) printf("%3d",b[i][j]); else printf(" .");
t += b[i][j];
}
printf("%5d\n",t);
}
gt = 0; printf(" ");
for (j = 0; j < 24; j++)
{
t = 0; for (i = 0; i < 31; i++) t += b[i][j];
gt += t; printf("%3d",t);
}
printf("%5d\n",gt);
return gt;
}
dogate()
{
switch(fn)
{
case 'E': gate += (long)tdiff(&gat,&cur); break;
case 'S': ngate++; break;
default: ;
}
gat = cur;
if (lall) switch(fn)
{
case 'A': printf("Attempted connect to %s\n", lp); break;
case 'C': printf("Connect to %s\n", lp); break;
case 'E': printf("GateWay End\n"); break;
case 'M': printf("Monitor Start\n"); break;
case 'S': printf("GateWay Start\n"); break;
case 'U': printf("Unproto Start\n"); break;
}
}
dofile()
{
if (lall) switch(fn)
{
case 'D': printf("Download %s\n", lp); break;
case 'U': printf("Upload %s\n", lp); break;
case 'W': printf("Directory %s\n", lp); break;
}
switch(fn)
{
case 'D': ndown++; break;
case 'U': nup++; break;
}
}
dofwd()
{
register int i, find;
register char *cp, *llp;
char call[9];
++fbin[i2(cur.day) - 1][i2(cur.time)];
for (llp = lp; *llp isnt ' '; llp++); llp++;
llp += 2;
for (cp = call; ((cp < call + 9) and (*llp isnt ' ') and (*llp isnt '\0'));)
*(cp++) = *(llp++);
for (;cp < call + 9;) *(cp++)=' ';
#ifndef MCH_AMIGA
find = false;
for (fp = fwdhd; ((fp isnt NULL) and !find); fp=fp->next)
{
find = !strncmp(fp->call, call, 9);
if (find) ++(fp->count);
}
if (!find)
{
fp = (FWD *)malloc(sizeof(FWD));
fp->next = fwdhd; fwdhd = fp;
fp->count = 1; strncpy(fp->call, call, 9);
}
#else
/* getuser finds call if it exists already and creates a new record if
it doesn't. Either way, it returns a pointer to the item.
*/
fp_file = getuser(&call[0]);
fp_file->count++;
#endif
}
/*
*/
domsg()
{
#ifndef MCH_AMIGA
register int etime;
#else
register long etime;
#endif
switch(fn)
{
case 'F':
if (sfn is 'S') sfwd = cur;
else if (sfn is 'E')
{
etime = tdiff(&sfwd, &cur);
if (aconnect) fwdcon += (long)etime; else fwddis += (long)etime;
}
else if (sfn isnt 'R') dofwd();
break;
#ifdef MCH_AMIGA
case 'R':
fp_conx->reads++;
break;
case 'S':
fp_conx->sends++;
#endif
case 'C':
case 'M':
#ifndef MCH_AMIGA
case 'S':
#endif
nmsg++;
if (sfn is 'T') nts++;
break;
}
if (lall) switch(fn)
{
case 'C': printf("Copy %s\n", lp); break;
case 'E': printf("Edit %s\n", lp); break;
case 'F':
if (sfn is 'S')
printf("Begin forwarding\n");
else if (sfn is 'E')
printf("End forwarding\n (Forward for %d minutes)\n", etime);
else if (sfn is 'R')
printf("Begin reverse forward %s\n", lp);
else printf("Forward %s\n", lp);
break;
case 'K': printf("Kill %s\n", lp); break;
case 'L': printf("List %s\n", lp); break;
case 'M': printf("Make %s\n", lp); break;
case 'R': printf("Read %s\n", lp); break;
case 'S': printf("Send %s\n", lp); break;
default: printf("%c %s\n",sfn, lp); break;
}
}
doexit()
{
#ifndef MCH_AMIGA
int etime;
#else
long etime;
#endif
char *sp;
aconnect = false;
first = true;
wasq = (fn is 'Q');
dis = cur;
etime = tdiff(&con, &dis);
if (isuser) connected += (long)etime; else sysop += (long)etime;
#ifdef MCH_AMIGA
/* 'Charge' this connect time to the user */
if(isuser || sysop_log) {
fp_conx->connect += etime;
}
#endif
if (lall)
{
switch(fn)
{
case 'A': sp = "(On Line)"; break;
case 'B': sp = "(Said Bye)"; break;
case 'D': sp = "(Disconnect)"; break;
case 'E': sp = "(Excluded)"; break;
case 'F': sp = "(Forced by sysop)"; break;
case 'Q': sp = "(Exit from program)"; break;
case 'T': sp = "(Timed out)"; break;
}
printf("Exit %s\n (Connected for %d minutes.)\n", sp, etime);
}
}
doconn()
{
#ifdef MCH_AMIGA
register char *p,*q;
sysop_log = 0;
#endif
aconnect = true;
con = cur;
switch(fn)
{
case 'S':
isuser = false;
scon++;
#ifndef MCH_AMIGA
strncpy(call, lp, 6);
#else
strncpy(sysop_call, lp, 6);
#endif
idle += (long)tdiff(&dis, &con);
#ifdef MCH_AMIGA
/* Copy the callsign with SSID and locate the user record */
p = conx_call;
q = lp;
while(*q == ' ')q++;
while((*q != ' ') && *q) *p++ = *q++;
while(p < &conx_call[9])*p++ = ' ';
fp_conx = getuser(conx_call);
fp_conx->conx_count++;
sysop_log++;
#endif
break;
case 'I':
isuser = false;
scon++;
if (wasq) offline += (long)tdiff(&dis, &con);
else {
crash++;
dis = las;
wasq = true;
down += (long)tdiff(&dis, &con);
}
#ifdef MCH_AMIGA
/* The program does not get the number of minutes in the log correct
unless this is done. This is because a 'C' command calculates the
time involved from the last 'X'. But sometimes there can be two
or more ocnsecutive 'C' without an intervening 'X', especially the
'C...I' indicating a reboot, followed by some arbitrary time later
by 'C...A' indicating a connect on port 'A'. The second connect would
compute the time from the last 'X' when in fact it should be using
the last 'C...I'.
*/
dis = con;
#endif
break;
case 'L':
links++;
break;
default:
isuser = true;
++cbin[i2(cur.day)-1][i2(cur.time)];
idle += (long)tdiff(&dis, &con);
#ifdef MCH_AMIGA
/* Copy the callsign with SSID and locate the user record */
p = conx_call;
q = lp;
while(*q == ' ')q++;
while((*q != ' ') && *q) *p++ = *q++;
while(p < &conx_call[9])*p++ = ' ';
fp_conx = getuser(conx_call);
fp_conx->conx_count++;
#endif
break;
}
if (lall) switch(fn)
{
case 'S': printf("From local console (%s)\n", lp); break;
case 'I': printf("System startup\n"); break;
case 'L': printf("Linked to %s\n", lp); break;
default: printf("Connected on port %c to %s\n",fn, lp); break;
}
first = false;
}
#ifndef MCH_AMIGA
.tdiff(st,et)
struct t *st, *et;
{
register int i;
i = t4(et->time) - t4(st->time);
if (i >= 0) return i;
if ((st->day[0] is et->day[0]) and (st->day[1] is et->day[1])) return 0;
return i + 1440;
}
#else
/* The tdiff code will fail if a difference of more than two days is
requested.
*/
long tdiff(st,et)
struct t *st,*et;
{
register long i,j;
i = t4(et->time) + (long)i2(et->day)*1440L;
j = t4(st->time) + (long)i2(st->day)*1440L;
i -= j;
if(i < 0)return(0L);
return(i);
}
#endif
i4(t)
char *t;
{
int i, j;
j = 0;
for (i = 0; (i < 4) and *t and (*t isnt ' '); i++, t++)
j = (10 * j) + (*t - '0');
return j;
}
t4(t)
char *t;
{ return(60 * i2(t) + i2(t + 2)); }
i2(t)
char *t;
{
if (*t is ' ') *t = '0';
if (*(t+1) is ' ') *(t+1) = '0';
return(10*(*t - '0') + (*(t+1) - '0'));
}